# coding:utf-8

from sklearn import  svm
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import  colors
from sklearn.model_selection import  train_test_split
from sklearn import  datasets
from mpl_toolkits.mplot3d import  Axes3D
from sklearn.decomposition import PCA

# iris 加载数据的原型，这里包括真实的数据，以及对数据的一些说明
# dataset.load_iris return data,target,description of data,feature_names
iris = datasets.load_iris()
"""获取所有行的数据，但只获取前两列数据，这里只获取真实数据把描述信息过滤掉
len(x) ---> numpy.ndarray 二维数组 iris.data[:,:2] 第一个 ":" 表示
针对行来切片，相当于 list[:],所有的行，第二个 ":" 表示列切片 list[:2]
只保留前两个
x 是一个 150 * 4 二维数组
"""
x = iris.data[:, :2]

# 获取 target 列
y = iris.target

# x[:,0] 表示索引为0列所有的项， [:,1] 表示索引为1列所有的项
x_min,x_max = x[:,0].min() - 0.5, x[:,0].max() + 0.5
y_min,y_max = x[:,1].min() - 0.5, x[:,1].max() + 0.5

"""
figure 创建一个画板
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, **kwargs)
num:图像编号，可以是 int/string，如果不指定这个编号自动增加，如果给定的数字存在
就自动激活，并返回一个引用，如果不存在就创建，并将其返回，这个参数的可选
figsize 画板的尺寸，默认可以不用指定，取值 rc figure.figsize.这个参数是一个元组 tuple(int)
dpi: 图像分辨率，可选参数.type: int default: None 如果没有给定默认值 rc figure.dpi
facecolor: 背景的颜色，可选参数,如果没有给定，默认是 rc figure.facecolor
edgecolor: 边框的颜色，可选参数，如果没有给定，默认是 rc figure.edgecolor
return: figure:Figure
上述参数的默认值见 $PYTHON_HOME\site-packages\matplotlib\mpl-data\matplotlibrc 这个文件
最后需要注意，创建的画板如果不使用了，需要关闭，节省内存
"""
# plt.figure(2,figsize=(8,6))
plt.figure(2,figsize=(10,8))
# 清除当前的画板，使其变成空白的
plt.clf()
# plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.Set1,edgecolors='k')
plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.Set1,edgecolors='k')
plt.xlabel("Sepal length")
plt.ylabel("Sepal width")
# 限制 x/y 轴的最大值和最小值
plt.xlim(x_min,x_max)
plt.ylim(y_min,y_max)
# 图没有变化，只是将 x/y 轴的刻度标签去掉了
plt.xticks(())
plt.yticks(())

fig = plt.figure(1,figsize=(8,6))
ax = Axes3D(fig,elev=150,azim=110)
x_reduced = PCA(n_components=3).fit_transform(iris.data)
ax.scatter(x_reduced[:,0],x_reduced[:,1],x_reduced[:,2],c=y,cmap=plt.cm.Set1,edgecolor='k',s=40)
ax.set_title("Frist three PCA directions")
ax.set_xlabel("1st eigenvector")
ax.w_xaxis.set_ticklabels([])
ax.set_ylabel("2nd eigenvector")
ax.w_yaxis.set_ticklabels([])
ax.set_zlabel("3rd eigenvector|")
ax.w_zaxis.set_ticklabels([])
plt.show()

